#include "stm32f10x.h"                  // Device header
/**
  * @brief  对一个GPIO口进行初始化
  * @param  GPIOx: 哪一片GPIO（从如下选项中选择）
  *     @arg RCC_APB2Periph_AFIO, RCC_APB2Periph_GPIOA, RCC_APB2Periph_GPIOB,
  *          RCC_APB2Periph_GPIOC, RCC_APB2Periph_GPIOD, RCC_APB2Periph_GPIOE,
  *          RCC_APB2Periph_GPIOF, RCC_APB2Periph_GPIOG, RCC_APB2Periph_ADC1,
  *          RCC_APB2Periph_ADC2, RCC_APB2Periph_TIM1, RCC_APB2Periph_SPI1,
  *          RCC_APB2Periph_TIM8, RCC_APB2Periph_USART1, RCC_APB2Periph_ADC3,
  *          RCC_APB2Periph_TIM15, RCC_APB2Periph_TIM16, RCC_APB2Periph_TIM17,
  *          RCC_APB2Periph_TIM9, RCC_APB2Periph_TIM10, RCC_APB2Periph_TIM11         
  * @param  pin：一片GPIO中具体哪个引脚（参照结构体GPIO_InitTypeDef中的定义）
	* @param  mode：此引脚的工作模式（同上）
  * @retval None
  */
void gpio_Init(uint32_t RCC_APB2Periph, GPIO_TypeDef* GPIOx, uint16_t pin, GPIOMode_TypeDef mode)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph, ENABLE);
	GPIO_InitTypeDef GPIO_Initstructure;
	GPIO_Initstructure.GPIO_Mode = mode;
	GPIO_Initstructure.GPIO_Pin = pin;
	GPIO_Initstructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOx, &GPIO_Initstructure);
}

/**
* @brief  控制一个端口为低电平（作为驱动LED的程序时默认采用低电平的方式）
  * @param  GPIOx: 哪一片GPIO（从如下选项中选择）
  *     @arg RCC_APB2Periph_AFIO, RCC_APB2Periph_GPIOA, RCC_APB2Periph_GPIOB,
  *          RCC_APB2Periph_GPIOC, RCC_APB2Periph_GPIOD, RCC_APB2Periph_GPIOE,
  *          RCC_APB2Periph_GPIOF, RCC_APB2Periph_GPIOG, RCC_APB2Periph_ADC1,
  *          RCC_APB2Periph_ADC2, RCC_APB2Periph_TIM1, RCC_APB2Periph_SPI1,
  *          RCC_APB2Periph_TIM8, RCC_APB2Periph_USART1, RCC_APB2Periph_ADC3,
  *          RCC_APB2Periph_TIM15, RCC_APB2Periph_TIM16, RCC_APB2Periph_TIM17,
  *          RCC_APB2Periph_TIM9, RCC_APB2Periph_TIM10, RCC_APB2Periph_TIM11         
  * @param  pin：一片GPIO中具体哪个引脚（参照结构体GPIO_InitTypeDef中的定义）
  * @retval None
  */
void LED_On(GPIO_TypeDef* GPIOx, uint16_t pin)
{
	GPIO_ResetBits(GPIOx, pin);
}

/**
* @brief  控制一个端口为高电平（作为驱动LED的程序时默认采用低电平的方式）
  * @param  GPIOx: 哪一片GPIO（从如下选项中选择）
  *     @arg RCC_APB2Periph_AFIO, RCC_APB2Periph_GPIOA, RCC_APB2Periph_GPIOB,
  *          RCC_APB2Periph_GPIOC, RCC_APB2Periph_GPIOD, RCC_APB2Periph_GPIOE,
  *          RCC_APB2Periph_GPIOF, RCC_APB2Periph_GPIOG, RCC_APB2Periph_ADC1,
  *          RCC_APB2Periph_ADC2, RCC_APB2Periph_TIM1, RCC_APB2Periph_SPI1,
  *          RCC_APB2Periph_TIM8, RCC_APB2Periph_USART1, RCC_APB2Periph_ADC3,
  *          RCC_APB2Periph_TIM15, RCC_APB2Periph_TIM16, RCC_APB2Periph_TIM17,
  *          RCC_APB2Periph_TIM9, RCC_APB2Periph_TIM10, RCC_APB2Periph_TIM11         
  * @param  pin：一片GPIO中具体哪个引脚（参照结构体GPIO_InitTypeDef中的定义）
  * @retval None
  */
void LED_Off(GPIO_TypeDef* GPIOx, uint16_t pin)
{
	GPIO_SetBits(GPIOx, pin);
}

/**
* @brief   翻转端口的输出电平
  * @param  GPIOx: 哪一片GPIO（从如下选项中选择）
  *     @arg RCC_APB2Periph_AFIO, RCC_APB2Periph_GPIOA, RCC_APB2Periph_GPIOB,
  *          RCC_APB2Periph_GPIOC, RCC_APB2Periph_GPIOD, RCC_APB2Periph_GPIOE,
  *          RCC_APB2Periph_GPIOF, RCC_APB2Periph_GPIOG, RCC_APB2Periph_ADC1,
  *          RCC_APB2Periph_ADC2, RCC_APB2Periph_TIM1, RCC_APB2Periph_SPI1,
  *          RCC_APB2Periph_TIM8, RCC_APB2Periph_USART1, RCC_APB2Periph_ADC3,
  *          RCC_APB2Periph_TIM15, RCC_APB2Periph_TIM16, RCC_APB2Periph_TIM17,
  *          RCC_APB2Periph_TIM9, RCC_APB2Periph_TIM10, RCC_APB2Periph_TIM11         
  * @param  pin：一片GPIO中具体哪个引脚（参照结构体GPIO_InitTypeDef中的定义）
  * @retval None
  */

void LED_Toggle(GPIO_TypeDef* GPIOx, uint16_t pin)
{
	if(GPIO_ReadOutputDataBit(GPIOx, pin))
	{
		LED_On(GPIOx, pin);
	}
	else
	{
		LED_Off(GPIOx, pin);
	}
}
